"""
这里的泛型函数市值由一组不同类型参数执行相似操作的函数组成的函数，具体调用哪一个函数的实现取决于分发算法
和参数类型。python单分发器是实现泛型函数的一种形式，由一个参数来决定选择和点用函数那个函数，下面的代码
演示了单分发器泛型含税的有关算法：

"""


from functools import singledispatch


@singledispatch
def fun(arg, verbose=False):
    """如果没有合适的函数，就调用这个函数"""
    if verbose:
        print("let me just say", end="")
        print(arg)


# 把register当做修饰器使用,为不同的类型参数分别创建不同的实现
# 使用下划线表示不关心函数的具体名字


@fun.register(int)
def _(arg, verbose=False):
    if verbose:
        print("strength in numbers, eh?", end="")
        print(arg)


# 也可以给函数去个名字
@fun.register(float)
def fun_num(arg, verbose=False):
    """ 如果第一个参数类型是float， 就调用这个函数"""
    if verbose:
        print("Half of your number is:", end="")
    print(arg / 2)


@fun.register(list)
@fun.register(tuple)
def _(arg, verbose=False):
    """如果第一个函数list或者tuple， 就调用这个函数"""
    if verbose:
        print("Enumerate this:")
        for i, v in enumerate(arg):
            print(i, v)


# 自定义类
class Scores:
    def __init__(self, *score):
        self.score = list(score)


# 为自定义类型创建泛型函数
@fun.register(Scores)
def _(arg, verbose=False):
    if verbose:
        print("'The scores are:")
        for sc in arg.score:
            print(sc, end="")

# 如果第一个函数的参数时None， 就调用这个函数


def doNothing(arg, verbose=False):
    print("Nothing to do")


# 可以把register()当做函数使用来注册指定的类型
# @fun.register(type(None), doNothing)


# 调用原函数
fun("hello world!")

# 调用针对整形参数的函数
fun(666, True)

# 调用针对整形参数的函数
fun(6.66)

# 针对列表和元组参数组成的函数
fun(list(range(5, 10)))
fun(tuple(range(10, 15)))

# 针对None类型参数的函数doNothing()
fun(None)

# 调用原始函数
fun({1, 2, 3}, True)

# 调用针对自定义类型参数Scores参数的函数
fun(Scores(1, 2, 3, 4, 5))






















